"""
时区处理工具函数
统一使用UTC时间标准，确保前后端时间一致性
"""

from datetime import datetime, timezone, date, timedelta
from typing import Union, Optional
import pytz


def parse_date_string_utc(date_string: str) -> Optional[date]:
    """
    解析日期字符串为UTC日期对象
    
    Args:
        date_string: 日期字符串 (YYYY-MM-DD 格式)
        
    Returns:
        date对象，解析失败返回None
    """
    if not date_string:
        return None
        
    try:
        return datetime.strptime(date_string, "%Y-%m-%d").date()
    except ValueError:
        return None


def create_utc_datetime(target_date: Union[str, date], hour: int = 0, minute: int = 0) -> Optional[datetime]:
    """
    创建UTC时间对象
    
    Args:
        target_date: 目标日期 (str或date对象)
        hour: 小时 (0-23)
        minute: 分钟 (0-59)
        
    Returns:
        UTC时间对象，创建失败返回None
    """
    try:
        if isinstance(target_date, str):
            date_obj = parse_date_string_utc(target_date)
            if not date_obj:
                return None
        elif isinstance(target_date, date):
            date_obj = target_date
        else:
            return None
            
        return datetime.combine(
            date_obj, 
            datetime.min.time().replace(hour=hour, minute=minute)
        ).replace(tzinfo=timezone.utc)
        
    except (ValueError, TypeError):
        return None


def get_current_utc_date() -> date:
    """
    获取当前UTC日期
    
    Returns:
        当前UTC日期
    """
    return datetime.now(timezone.utc).date()


def get_current_utc_datetime() -> datetime:
    """
    获取当前UTC时间
    
    Returns:
        当前UTC时间
    """
    return datetime.now(timezone.utc)


def format_date_for_response(date_obj: Union[date, datetime, str]) -> str:
    """
    格式化日期用于API响应
    
    Args:
        date_obj: 日期对象
        
    Returns:
        YYYY-MM-DD格式的日期字符串
    """
    if isinstance(date_obj, str):
        return date_obj
    elif isinstance(date_obj, datetime):
        return date_obj.date().strftime("%Y-%m-%d")
    elif isinstance(date_obj, date):
        return date_obj.strftime("%Y-%m-%d")
    else:
        return str(date_obj)


def validate_date_range(start_date: str, end_date: str, max_days: int = 90) -> dict:
    """
    验证日期范围
    
    Args:
        start_date: 开始日期字符串
        end_date: 结束日期字符串
        max_days: 最大允许天数
        
    Returns:
        验证结果字典
    """
    start_obj = parse_date_string_utc(start_date)
    end_obj = parse_date_string_utc(end_date)
    
    if not start_obj or not end_obj:
        return {
            "valid": False,
            "message": "日期格式不正确，请使用YYYY-MM-DD格式"
        }
    
    if start_obj > end_obj:
        return {
            "valid": False,
            "message": "开始日期不能晚于结束日期"
        }
    
    day_diff = (end_obj - start_obj).days + 1
    
    if day_diff > max_days:
        return {
            "valid": False,
            "message": f"日期范围不能超过{max_days}天，当前选择了{day_diff}天"
        }
    
    return {
        "valid": True,
        "message": f"日期范围验证成功，共{day_diff}天",
        "day_count": day_diff,
        "start_date": start_obj,
        "end_date": end_obj
    }


def get_timezone_info() -> dict:
    """
    获取时区信息
    
    Returns:
        时区信息字典
    """
    now_utc = get_current_utc_datetime()
    
    return {
        "current_utc_time": now_utc.isoformat(),
        "timezone": "UTC",
        "utc_offset": 0,
        "server_timezone": str(now_utc.tzinfo)
    }


def convert_to_brussels_timezone(utc_datetime: datetime) -> datetime:
    """
    将UTC时间转换为布鲁塞尔时区 (用于ENTSO-E数据)
    
    Args:
        utc_datetime: UTC时间对象
        
    Returns:
        布鲁塞尔时区时间对象
    """
    brussels_tz = pytz.timezone('Europe/Brussels')
    return utc_datetime.replace(tzinfo=timezone.utc).astimezone(brussels_tz)


def generate_future_dates(days_ahead: int = 7) -> list:
    """
    生成未来日期列表
    
    Args:
        days_ahead: 未来天数
        
    Returns:
        日期字典列表
    """
    current_date = get_current_utc_date()
    dates = []
    
    for i in range(days_ahead):
        future_date = current_date + timedelta(days=i)
        dates.append({
            "date": format_date_for_response(future_date),
            "utc_timestamp": int(create_utc_datetime(future_date).timestamp()),
            "day_of_week": future_date.strftime("%A"),
            "day_of_week_cn": future_date.strftime("%w")  # 0=周日, 1=周一, ...
        })
    
    return dates


# 兼容性函数，用于现有代码迁移
def parse_date_safely(date_input: Union[str, date, datetime]) -> Optional[date]:
    """
    安全解析日期输入，兼容多种格式
    
    Args:
        date_input: 日期输入（字符串、date或datetime对象）
        
    Returns:
        date对象，解析失败返回None
    """
    if isinstance(date_input, date):
        return date_input
    elif isinstance(date_input, datetime):
        return date_input.date()
    elif isinstance(date_input, str):
        return parse_date_string_utc(date_input)
    else:
        return None